import configparser
import os
import sys

import urllib3
from langchain.agents import initialize_agent, Tool, AgentType
from langchain_community.utilities import SerpAPIWrapper
from langchain_openai import ChatOpenAI

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))

# 导入配置读取器
from config_reader import get_deepseek_api_key, get_serpapi_api_key


def read_config(config_file='config.ini'):
    """
    读取配置文件
    :param config_file: 配置文件路径
    :return: 配置对象
    """
    config = configparser.ConfigParser()

    # 获取当前文件所在目录
    current_dir = os.path.dirname(os.path.abspath(__file__))
    # 获取项目根目录 (当前文件在 Agents/DifferentAgentType/ 下，需要向上两级到项目根目录)
    project_root = os.path.dirname(os.path.dirname(current_dir))
    config_path = os.path.join(project_root, config_file)

    if not os.path.exists(config_path):
        raise FileNotFoundError(f"配置文件不存在: {config_path}")

    config.read(config_path, encoding='utf-8')
    return config


def get_llm_config(config_file='config.ini'):
    """
    获取LLM配置
    :param config_file: 配置文件路径
    :return: 包含LLM配置的字典
    """
    config = read_config(config_file)

    llm_config = {
        'provider': config.get('llm', 'provider', fallback='deepseek'),
        'model': config.get('llm', 'model', fallback='deepseek-chat'),
        'temperature': config.getfloat('llm', 'temperature', fallback=0.2),
        'max_tokens': config.getint('llm', 'max_tokens', fallback=2000),
        'top_p': config.getfloat('llm', 'top_p', fallback=1.0)
    }

    return llm_config


def get_agent_config(config_file='config.ini'):
    """
    获取Agent配置
    :param config_file: 配置文件路径
    :return: 包含Agent配置的字典
    """
    config = read_config(config_file)

    agent_config = {
        'query': config.get('agent', 'query', fallback='2024年奥运会的举办城市是哪里？')
    }

    return agent_config


try:
    # 从配置文件获取API密钥
    deepseek_api_key = get_deepseek_api_key()
    serpapi_key = get_serpapi_api_key()

    # 获取LLM配置
    llm_config = get_llm_config()

    # 获取Agent配置
    agent_config = get_agent_config()

except Exception as e:
    print(f"配置错误：{e}")
    exit(1)

# 初始化 DeepSeek LLM
llm = ChatOpenAI(
    model=llm_config['model'],
    temperature=llm_config['temperature'],
    max_tokens=llm_config['max_tokens'],
    openai_api_key=deepseek_api_key,
    openai_api_base="https://api.deepseek.com"
)

# 配置SSL和网络设置
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# 初始化搜索工具（SerpAPI）
try:
    # 直接使用SerpAPIWrapper，但配置SSL设置
    search = SerpAPIWrapper(serpapi_api_key=serpapi_key)
    # 配置SSL设置
    search.search.session.verify = False
    print("搜索工具初始化成功")
except Exception as e:
    print(f"搜索工具初始化失败：{e}")


    # 如果搜索工具失败，创建一个模拟工具
    class MockSearch:
        def run(self, query):
            return "由于网络连接问题，无法获取实时搜索结果。2024年奥运会的举办城市是法国巴黎。"


    search = MockSearch()

# 定义可用的工具列表
tools = [
    Tool(
        name="Search",
        func=search.run,
        description="当你需要最新信息或不确定的内容时使用，例如新闻、天气、时事等。"
    )
]

# 初始化 ReAct Agent
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,  # 使用零样本ReAct模式
    verbose=True,  # 打印思考过程
    handle_parsing_errors=True,  # 处理解析错误
    max_iterations=3  # 限制最大迭代次数
)

# 运行 Agent
query = agent_config['query']
print(f"查询问题：{query}")
response = agent.run(query)

print("最终回答：", response)
